home *** CD-ROM | disk | FTP | other *** search
- /*
- * Wait for a string on the stdin. Returns a 0 on success, 1 on failure
- * and -1 on error. This is an external program designed to be used in
- * shell scripts.
- */
-
- #define TIMEOUT 10
- #define BUF_SIZ 1024
- #define STRSTR
-
- int wf_flag;
-
- #include <stdio.h>
- #include <signal.h>
- #include "config.h"
-
- #ifdef BSD
- #include <setjmp.h>
- jmp_buf wf_buf;
- #endif /* BSD */
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- int i, j, timeout;
- char c, buf[BUF_SIZ], *string, *strstr();
- long t, time();
- void exit();
-
- if (argc < 2 || argc > 3) {
- fprintf(stderr, "Usage: waitfor -n string\n");
- exit(-1);
- }
-
- if (argv[1][0] == '-') {
- timeout = atoi(&argv[1][1]);
- if (argc != 3) {
- fprintf(stderr, "Usage: waitfor -n string\n");
- exit(-1);
- }
- string = argv[2];
- }
- else {
- timeout = TIMEOUT;
- string = argv[1];
- }
- /* here we go.. */
- i = 0;
- time(&t);
- while ((time((long *) 0) - t) < timeout) {
- if ((j = getc_line()) != -1) {
- c = j & 0x7f;
- /* no NULLs please */
- if (c != '\0') {
- buf[i++] = c;
- buf[i] = '\0';
- }
-
- if (i >= BUF_SIZ) {
- fprintf(stderr, "waitfor: buffer overflow\n");
- exit(-1);
- }
- /* yea.. we found it! */
- if (strstr(buf, string))
- exit(0);
- }
- }
- exit(1);
- }
-
- int
- getc_line()
- {
- int wf_force();
- char c;
- unsigned int alarm();
-
- signal(SIGALRM, (SIG_TYPE(*) ()) wf_force);
- wf_flag = 0;
-
- alarm(1);
-
- #ifdef BSD
- if (setjmp(wf_buf))
- return(-1);
- #endif /* BSD */
-
- if (read(0, &c, 1) <= 0) {
- alarm(0);
- return(-1);
- }
- if (wf_flag)
- return(-1);
- alarm(0);
- return(c & 0xff);
- }
-
- /* ARGSUSED */
- int
- wf_force(dummy)
- int dummy;
- {
- #ifdef BSD
- longjmp(wf_buf, 1);
- #else /* BSD */
- signal(SIGALRM, (SIG_TYPE(*) ()) wf_force);
- wf_flag = 1;
- #endif /* BSD */
- }
-
- #ifdef STRSTR
- /*
- * Return a pointer to the first occurrence of string str2 in str1.
- * Returns a NULL if str2 is not in str1.
- */
-
- char *
- strstr(str1, str2)
- char *str1, *str2;
- {
- int len;
- len = strlen(str2);
- while (*str1) {
- if (*str2 == *str1) {
- if (!strncmp(str2, str1, len))
- return(str1);
- }
- str1++;
- }
- return(NULL);
- }
- #endif /* STRSTR */
-